require('mysql')
var fs = require('fs')
var orm = require('orm')
var Promise = require('bluebird')
var path = require('path')

/**
 * 数据库配置
 *
 * @param {*} app       应用程序环境
 * @param {*} callback  回调
 */
function initialize(app, callback) {
  // 加载配置文件
  var config = require('config').get('db_config')

  // 从配置中获取数据库配置
  var opts = {
    protocol: config.get('protocol'),
    host: config.get('host'),
    database: config.get('database'),
    port: config.get('port'),
    user: config.get('user'),
    password: config.get('password'),
    query: { pool: true, debug: true }
  }

  console.log('数据库连接参数 %s', JSON.stringify(opts))

  // 初始化ORM模型
  app.use(
    orm.express(opts, {
      define: function (db, models, next) {
        app.db = db
        global.database = db

        // 获取映射文件路径
        var modelsPath = path.join(process.cwd(), '/models')

        // 读取所有模型文件
        fs.readdir(modelsPath, function (err, files) {
          // 存放所有的加载模型函数
          var loadModelAsynFns = new Array()
          // console.log("开始加载 ORM 模型层文件 ");
          for (var i = 0; i < files.length; i++) {
            var modelPath = modelsPath + '/' + files[i]
            // console.log("加载模型 %s",modelPath);
            loadModelAsynFns[i] = db.loadAsync(modelPath)
          }

          Promise.all(loadModelAsynFns)
            .then(function () {
              // console.log("ORM 模型加载完成");
              // 挂载模型集合

              for (var modelName in db.models) {
                models[modelName] = db.models[modelName]
              }
              app.models = models
              callback(null)
              next()
            })
            .catch(function (error) {
              console.error('加载模块出错 error: ' + err)
              callback(error)
              next()
            })
        })
      }
    })
  )
}

module.exports.initialize = initialize
module.exports.getDatabase = function () {
  return global.database
}
